home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / Numeric / ArrayPrinter.py < prev    next >
Text File  |  2006-01-20  |  8KB  |  215 lines

  1. # Array printing function
  2. #
  3. # Written by Konrad Hinsen <hinsenk@ere.umontreal.ca>
  4. # last revision: 1996-3-13
  5. # modified by Jim Hugunin 1997-3-3 for repr's and str's (and other details)
  6.  
  7. import sys
  8. from umath import *
  9. import Numeric
  10.  
  11. def array2string(a, max_line_width = None, precision = None,
  12.                      suppress_small = None, separator=' ',
  13.                      array_output=0):
  14.     """array2string(a, max_line_width = None, precision = None,
  15.                      suppress_small = None, separator=' ',
  16.                      array_output=0)"""
  17.     if len(a.shape) == 0:
  18.         return str(a[0])
  19.  
  20.     if multiply.reduce(a.shape) == 0:
  21.         return "zeros(%s, '%s')" % (a.shape, a.typecode())
  22.  
  23.     if max_line_width is None:
  24.         try:
  25.             max_line_width = sys.output_line_width
  26.         except AttributeError:
  27.             max_line_width = 77
  28.     if precision is None:
  29.         try:
  30.             precision = sys.float_output_precision
  31.         except AttributeError:
  32.             precision = 8
  33.     if suppress_small is None:
  34.         try:
  35.             suppress_small = sys.float_output_suppress_small
  36.         except AttributeError:
  37.             suppress_small = 0
  38.     data = Numeric.ravel(a)
  39.     type = a.typecode()
  40.     items_per_line = a.shape[-1]
  41.     # dvhart - added 'u' to list
  42.     if type == 'b' or type == '1' or type == 's' or type == 'i' \
  43.        or type == 'w' or type == 'l' or type == 'u':
  44.         max_str_len = max(len(str(maximum.reduce(data))),
  45.                           len(str(minimum.reduce(data))))
  46.         format = '%' + str(max_str_len) + 'd'
  47.         item_length = max_str_len
  48.         format_function = lambda x, f = format: _formatInteger(x, f)
  49.     elif type == 'f' or type == 'd':
  50.         format, item_length = _floatFormat(data, precision, suppress_small)
  51.         format_function = lambda x, f = format: _formatFloat(x, f)
  52.     elif type == 'F' or type == 'D':
  53.         real_format, real_item_length = _floatFormat(data.real, precision,
  54.                                                      suppress_small, sign=0)
  55.         imag_format, imag_item_length = _floatFormat(data.imaginary, precision,
  56.                                                      suppress_small, sign=1)
  57.         item_length = real_item_length + imag_item_length + 3
  58.         format_function = lambda x, f1 = real_format, f2 = imag_format: \
  59.                           _formatComplex(x, f1, f2)
  60.     elif type == 'c':
  61.         item_length = 1
  62.         format_function = lambda x: x
  63.     elif type == 'O':
  64.         item_length = max(map(lambda x: len(str(x)), data))
  65.         format_function = _formatGeneral
  66.     else:
  67.         return str(a)
  68.     final_spaces = (type != 'c')
  69.     item_length = item_length+len(separator)
  70.     line_width = item_length*items_per_line - final_spaces
  71.     if line_width > max_line_width:
  72.         indent = 6
  73.         if indent == item_length:
  74.             indent = 8
  75.         items_first = (max_line_width+final_spaces)/item_length
  76.         if items_first < 1: items_first = 1
  77.         items_continuation = (max_line_width+final_spaces-indent)/item_length
  78.         if items_continuation < 1: items_continuation = 1
  79.         line_width = max(item_length*items_first,
  80.                          item_length*items_continuation+indent) - final_spaces
  81.         number_of_lines = 1 + (items_per_line-items_first +
  82.                                items_continuation-1)/items_continuation
  83.         line_format = (number_of_lines, items_first, items_continuation,
  84.                        indent, line_width, separator)
  85.     else:
  86.         line_format = (1, items_per_line, 0, 0, line_width, separator)
  87.     lst = _arrayToString(a, format_function, len(a.shape), line_format, 6*array_output, 0)[:-1]
  88.     if array_output:
  89.         if a.typecode() in ['l', 'd', 'D']:
  90.             return "array(%s)" % lst
  91.         else:
  92.             return "array(%s,'%s')" % (lst, a.typecode())
  93.     else:
  94.         return lst
  95.         
  96. def _floatFormat(data, precision, suppress_small, sign = 0):
  97.     exp_format = 0
  98.     non_zero = abs(Numeric.compress(not_equal(data, 0), data))
  99.     if len(non_zero) == 0:
  100.         max_val = 0.
  101.         min_val = 0.
  102.     else:
  103.         max_val = float(maximum.reduce(non_zero))
  104.         min_val = float(minimum.reduce(non_zero))
  105.         if max_val >= 1.e8:
  106.             exp_format = 1
  107.         if not suppress_small and (min_val < 0.0001 or max_val/min_val > 1000.):
  108.             exp_format = 1
  109.     if exp_format:
  110.         large_exponent = 0 < min_val < 1e-99 or max_val >= 1e100
  111.         max_str_len = 8 + precision + large_exponent
  112.         if sign: format = '%+'
  113.         else: format = '%'
  114.         format = format + str(max_str_len) + '.' + str(precision) + 'e'
  115.         if large_exponent: format = format + '3'
  116.         item_length = max_str_len 
  117.     else:
  118.         format = '%.' + str(precision) + 'f'
  119.         precision = min(precision, max(tuple(map(lambda x, p=precision,
  120.                                                  f=format: _digits(x,p,f),
  121.                                                  data))))
  122.         max_str_len = len(str(int(max_val))) + precision + 2
  123.         if sign: format = '%#+'
  124.         else: format = '%#'
  125.         format = format + str(max_str_len) + '.' + str(precision) + 'f'
  126.         item_length = max_str_len 
  127.     return (format, item_length)
  128.  
  129. def _digits(x, precision, format):
  130.     s = format % x
  131.     zeros = len(s)
  132.     while s[zeros-1] == '0': zeros = zeros-1
  133.     return precision-len(s)+zeros
  134.  
  135. def _arrayToString(a, format_function, rank, line_format, base_indent=0, indent_first=1):
  136.     if rank == 0:
  137.         return str(a[0])
  138.     elif rank == 1:
  139.         s = ''
  140.         s0 = '['
  141.         items = line_format[1]
  142.         if indent_first:
  143.             indent = base_indent
  144.         else:
  145.             indent = 0
  146.         index = 0
  147.         for j in range(line_format[0]):
  148.             s = s + indent * ' '+s0
  149.             for i in range(items):
  150.                 s = s + format_function(a[index])+line_format[-1]
  151.                 index = index + 1
  152.                 if index == a.shape[0]: break
  153.             if s[-1] == ' ': s = s[:-1]
  154.             s = s + '\n'
  155.             items = line_format[2]
  156.             indent = line_format[3]+base_indent
  157.             s0 = ''
  158.         s = s[:-len(line_format[-1])]+']\n'
  159.     else:
  160.         if indent_first:
  161.             s = ' '*base_indent+'['
  162.         else:
  163.             s = '['
  164.         for i in range(a.shape[0]-1):
  165.             s = s + _arrayToString(a[i], format_function, rank-1, line_format, base_indent+1, indent_first=i!=0)
  166.             s = s[:-1]+line_format[-1][:-1]+'\n'
  167.         s = s + _arrayToString(a[a.shape[0]-1], format_function,
  168.                                rank-1, line_format, base_indent+1)
  169.         s = s[:-1]+']\n'
  170.     return s
  171.  
  172. def _formatInteger(x, format):
  173.     return format % x
  174.  
  175. def _formatFloat(x, format, strip_zeros = 1):
  176.     if format[-1] == '3':
  177.         format = format[:-1]
  178.         s = format % x
  179.         third = s[-3]
  180.         if third == '+' or third == '-':
  181.             s = s[1:-2] + '0' + s[-2:]
  182.     elif format[-1] == 'f':
  183.         s = format % x
  184.         if strip_zeros:
  185.             zeros = len(s)
  186.             while s[zeros-1] == '0': zeros = zeros-1
  187.             s = s[:zeros] + (len(s)-zeros)*' '
  188.     else:
  189.         s = format % x
  190.     return s
  191.  
  192. def _formatComplex(x, real_format, imag_format):
  193.     r = _formatFloat(x.real, real_format)
  194.     i = _formatFloat(x.imag, imag_format, 0)
  195.     if imag_format[-1] == 'f':
  196.         zeros = len(i)
  197.         while zeros > 2 and i[zeros-1] == '0': zeros = zeros-1
  198.         i = i[:zeros] + 'j' + (len(i)-zeros)*' '
  199.     else:
  200.         i = i + 'j'
  201.     return r + i
  202.  
  203. def _formatGeneral(x):
  204.     return str(x) + ' '
  205.  
  206. if __name__ == '__main__':
  207.     a = Numeric.arange(10)
  208.     b = Numeric.array([a, a+10, a+20])
  209.     c = Numeric.array([b,b+100, b+200])
  210.     print array2string(a)
  211.     print array2string(b)
  212.     print array2string(sin(c), separator=', ', array_output=1)
  213.     print array2string(sin(c)+1j*cos(c), separator=', ', array_output=1)
  214.     print array2string(Numeric.array([[],[]]))
  215.